package com.shihb.creationalpatterns;

/**
 *Description:工厂模式
 * 作用：创建者和调用者的分离
 * 核心：用工厂创建对象，调用者和实现类解耦
 *Version:1.0.0
 *@author shihb
 *@date 2020/4/20 16:21
 */
public class FactoryPattern {

  public static void main(String[] args) {
    // 接口,所有实现类
    Bmw bmw = new Bmw();
    Tsl tsl = new Tsl();
    bmw.name();
    tsl.name();
    // 简单工厂方法
    SimpleCarFactory.getCar("宝马").name();
    SimpleCarFactory.getCar("特斯拉").name();
    // 工厂方法
    new TslFactory().getCar().name();
    new BmwFactory().getCar().name();

  }

}
interface Car {
  void name();
}
class Bmw implements Car{

  public void name() {
    System.out.println("宝马");
  }
}
class Tsl implements Car{
  public void name() {
    System.out.println("特斯拉");
  }
}
/**
 * 简单工厂
 * 弊端：增加一个新的产品，如果不修改代码做不到
 * 没有满足开闭原则
 */
class SimpleCarFactory{
  public static Car getCar(String car){
    if("宝马".equals(car)){
      return new Bmw();
    }else if("特斯拉".equals(car)){
      return new Tsl();
    }
    return null;

  }
}
/***
 * 工厂方法模式
 * 可以动态扩展的新的类，不会改变原来的类
 */

interface CarFactory{
  Car getCar();
}
class TslFactory implements CarFactory{
  public Car getCar() {
    return new Tsl();
  }
}
class BmwFactory implements CarFactory{

  public Car getCar() {
    return new Bmw();
  }
}
